package common

import (
	"crypto/md5"
	"crypto/rand"
	"encoding/base64"
	"encoding/hex"
	"fmt"
	"io"
	"strings"
)

// GenerateRandomSalt 生成随机盐
func GenerateRandomSalt(length int) (string, error) {
	salt := make([]byte, length)
	// 使用 rand.Read 函数从加密安全的随机数生成器中读取随机字节，并将其填充到 salt 字节数组中。
	_, err := rand.Read(salt)
	if err != nil {
		return "", err
	}
	saltString := base64.URLEncoding.EncodeToString(salt)
	return saltString, nil
}

// GenMD5 生成MD5
func GenMD5(code string) string {
	MD5 := md5.New()
	//io.WriteString(MD5, code) 将字符串 code 写入了 MD5 这个实现了 io.Writer 接口的对象中。这使得 code 字符串的内容被写入到 MD5 中进行后续的计算和处理。
	_, _ = io.WriteString(MD5, code)
	return hex.EncodeToString(MD5.Sum(nil))
}

// GenPassword  拼接密码
func GenPassword(salt string, password string) string {
	np := fmt.Sprintf("%s_%s", password, salt)
	md5Password := fmt.Sprintf("$%s$%s", salt, GenMD5(np))
	return md5Password
}

// VerifyPassword  验证密码
func VerifyPassword(input string, cPassword string) bool {
	parts := strings.Split(cPassword, "$")
	if len(parts) < 3 {
		return false
	}
	salt := parts[1]
	password := GenPassword(salt, input)
	return password == cPassword
}
